using UnityEngine;

// 框架设计示例命名空间
namespace FrameworkDesign.Example
{
    /// <summary>
    /// 全能功能执行类
    /// 包含所有可执行的操作方法
    /// </summary>
    public class CanDoEveryThing
    {
        /// <summary>
        /// 执行操作1
        /// </summary>
        public void DoSomething1()
        {
            Debug.Log("DoSomething1"); // 输出操作1日志
        }

        /// <summary>
        /// 执行操作2
        /// </summary>
        public void DoSomething2()
        {
            Debug.Log("DoSomething2"); // 输出操作2日志
        }

        /// <summary>
        /// 执行操作3
        /// </summary>
        public void DoSomething3()
        {
            Debug.Log("DoSomething3"); // 输出操作3日志
        }
    }

    /// <summary>
    /// 全能功能持有者接口
    /// 提供对全能功能对象的访问
    /// </summary>
    public interface IHasEveryThing
    {
        /// <summary>
        /// 获取全能功能实例
        /// </summary>
        CanDoEveryThing CanDoEveryThing { get; }
    }

    // 基础功能接口定义
    public interface ICanDoSomething1 : IHasEveryThing { }
    public interface ICanDoSomething2 : IHasEveryThing { }
    public interface ICanDoSomething3 : IHasEveryThing { }

    // 功能扩展方法定义
    public static class ICanDoSomeThing1Extensions
    {
        /// <summary>
        /// 执行操作1的扩展方法
        /// </summary>
        public static void DoSomething1(this ICanDoSomething1 self)
        {
            self.CanDoEveryThing.DoSomething1(); // 委托给全能对象执行
        }
    }

    public static class ICanDoSomeThing2Extensions
    {
        /// <summary>
        /// 执行操作2的扩展方法
        /// </summary>
        public static void DoSomething2(this ICanDoSomething2 self)
        {
            self.CanDoEveryThing.DoSomething2();
        }
    }

    public static class ICanDoSomeThing3Extensions
    {
        /// <summary>
        /// 执行操作3的扩展方法
        /// </summary>
        public static void DoSomething3(this ICanDoSomething3 self)
        {
            self.CanDoEveryThing.DoSomething3();
        }
    }

    // 示例测试类
    public class InterfaceRuleExample : MonoBehaviour
    {
        // 仅允许执行操作1的实现类
        public class OnlyCanDo1 : ICanDoSomething1
        {
            // 实现全能对象属性
            CanDoEveryThing IHasEveryThing.CanDoEveryThing { get; } = new CanDoEveryThing();
        }

        // 允许执行操作2和3的实现类
        public class OnlyCanDo23 : ICanDoSomething2, ICanDoSomething3
        {
            // 实现全能对象属性
            CanDoEveryThing IHasEveryThing.CanDoEveryThing { get; } = new CanDoEveryThing();
        }

        private void Start()
        {
            // 测试仅允许操作1的实例
            var onlyCanDo1 = new OnlyCanDo1();
            onlyCanDo1.DoSomething1();     // ✅ 允许调用
            // onlyCanDo1.DoSomething2();  // ❌ 编译错误
            // onlyCanDo1.DoSomething3();  // ❌ 编译错误

            // 测试允许操作2和3的实例
            var onlyCanDo23 = new OnlyCanDo23();
            // onlyCanDo23.DoSomething1(); // ❌ 编译错误
            onlyCanDo23.DoSomething2();    // ✅ 允许调用
            onlyCanDo23.DoSomething3();    // ✅ 允许调用
        }
    }
}